import javax.tools.*;
import java.io.File;
import java.util.Arrays;

/**
 * 使用Java编译器API生成AST示例
 */
public class JavaASTGeneration {

    public static void main(String[] args) {
        // 1. 获取Java编译器实例
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        // 2. 设置编译单元
        StandardJavaFileManager fileManager =
            compiler.getStandardFileManager(null, null, null);
        Iterable<? extends JavaFileObject> compilationUnits =
            fileManager.getJavaFileObjectsFromFiles(
                Arrays.asList(new File("Sample.java")));

        // 3. 设置编译选项和处理器
        DiagnosticCollector<JavaFileObject> diagnostics =
            new DiagnosticCollector<>();
        CompilationTask task = compiler.getTask(
            null,
            fileManager,
            diagnostics,
            null,
            null,
            compilationUnits);

        // 4. 执行编译并生成AST
        boolean success = task.call();

        if (success) {
            System.out.println("编译成功，AST已生成");
        } else {
            System.out.println("编译失败");
            diagnostics.getDiagnostics().forEach(d ->
                System.out.println(d.getMessage(null)));
        }
    }
}

// 使用JavaParser库的示例
class JavaParserExample {
    /*
    // 需要添加依赖：
    // implementation 'com.github.javaparser:javaparser-core:3.25.1'

    public static void parseJavaFile(String filePath) throws Exception {
        // 解析Java文件
        CompilationUnit cu = StaticJavaParser.parse(new File(filePath));

        // 遍历AST节点
        cu.findAll(MethodDeclaration.class).forEach(method -> {
            System.out.println("方法名: " + method.getName());
            System.out.println("参数: " + method.getParameters());
            System.out.println("返回类型: " + method.getType());
        });

        // 修改AST
        cu.getClassByName("Sample").ifPresent(classDecl -> {
            // 添加新方法
            classDecl.addMethod("newMethod", Modifier.Keyword.PUBLIC);
        });

        // 输出修改后的代码
        System.out.println(cu.toString());
    }
    */
}
